package megatron.view.cadastros;

import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.persistence.EntityManager;
import javax.swing.JOptionPane;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.AnchorPane;
import megatron.entidades.NaturezaPessoa;
import megatron.entidades.PessoaFisica;
import megatron.entidades.PessoaJuridica;
import megatron.util.ConsultasGerais;
import megatron.util.JpaUtil;
import megatron.view.Main;

public class FrmPesquisa<T> extends AnchorPane implements Initializable {

	@FXML
	TextField txtPesquisa;

	@FXML
	Button btPesquisar, btSeleciona;

	@FXML
	CheckBox chCnpj, chNome, chCPF;

	@FXML
	private TableView<Object> gridPesquisa;
	@FXML
	private TableColumn<Object, String> codigo, nomeFant, cpf, cnpj;

	private T typePessoa;

	private static ObservableList<Object> listConsultas = FXCollections
			.observableArrayList();

	private Main application;

	private ConsultasGerais consultasGerais = new ConsultasGerais();

	private static EntityManager em = JpaUtil.getEntityManager();

	private List<PessoaJuridica> pessoaJuridica = null;

	private List<PessoaFisica> pessoaFisica = null;
	
	private static int tipoPes;

	@Override
	public void initialize(URL location, ResourceBundle resources) {

		if (em.getTransaction().isActive()) {

		} else {
			em.getTransaction().begin();
		}

		codigo.setCellValueFactory(new PropertyValueFactory<Object, String>(
				"idPessoa"));
		nomeFant.setCellValueFactory(new PropertyValueFactory<Object, String>(
				"fantasia"));
		cnpj
				.setCellValueFactory(new PropertyValueFactory<Object, String>(
						"cnpj"));
		cpf
		.setCellValueFactory(new PropertyValueFactory<Object, String>(
				"cpf"));
		desabilita();
	}
	
	public static void addTipoClass(Class type){
		if(type == FrmCadEmpresa.class){
			tipoPes = 2;
		}
		
	}
	
	public Main getApplication() {
		return application;
	}

	public void setApplication(Main application, T typePessoa) {
		this.application = application;
		this.typePessoa = typePessoa;
	}

	public void setTypePessoa(T typePessoa) {
		this.typePessoa = typePessoa;
	}

	public T getTypePessoa() {
		return typePessoa;
	}

	public void selectCNPJ() {
		if (chCnpj.isSelected()) {
			chCPF.setSelected(false);
			chCPF.setDisable(true);
			chNome.setSelected(false);
			chNome.setDisable(true);
			habilita();
		} else {
			chCPF.setDisable(false);
			chNome.setDisable(false);
			desabilita();
		}
	}

	public void selectNOME() {
		if (chNome.isSelected()) {
			chCPF.setSelected(false);
			chCPF.setDisable(true);
			chCnpj.setSelected(false);
			chCnpj.setDisable(true);
			habilita();
		} else {
			chCPF.setDisable(false);
			chCnpj.setDisable(false);
			desabilita();
		}
	}

	public void selectrCPF() {
		if (chCPF.isSelected()) {
			chCnpj.setSelected(false);
			chCnpj.setDisable(true);
			chNome.setSelected(false);
			chNome.setDisable(true);
		} else {
			chCnpj.setDisable(false);
			chNome.setDisable(false);
			desabilita();
		}
	}

	public void desabilita() {
		btPesquisar.setDisable(true);
		btSeleciona.setDisable(true);
		if ((typePessoa == pessoaJuridica)
				|| (pessoaJuridica.isEmpty() == false)) {
			chCPF.setDisable(true);
		} else {
			chCPF.setDisable(false);
		}
	}

	public void habilita() {
		btPesquisar.setDisable(false);
	}

	public void habilitaSelec() {
		btSeleciona.setDisable(false);
	}

	public void pesquisar() {
		if (chCnpj.isSelected()) {
			pessoaJuridica = new ArrayList<PessoaJuridica>();
			pessoaJuridica = consultasGerais.pesquisaCNPJ(
					txtPesquisa.getText(), em);
			if (pessoaJuridica.isEmpty() == true) {
				JOptionPane.showMessageDialog(null,
						"Nenhum registro foi encontrado");
				application.close();
			} else {
				typePessoa = (T) pessoaJuridica;
				listConsultas.add(pessoaJuridica);
				habilitaSelec();
			}
		} else if (chCPF.isSelected()) {
			pessoaFisica = new ArrayList<PessoaFisica>();
			pessoaFisica = consultasGerais.pesquisaCPF(txtPesquisa.getText(),
					em);
			if (pessoaFisica.isEmpty() == true) {
				JOptionPane.showMessageDialog(null,
						"Nenhum registro foi encontrado");
				application.close();
			} else {
				typePessoa = (T) pessoaFisica;
				listConsultas.add(pessoaFisica);
				habilitaSelec();
			}
		} else {
			pessoaJuridica = new ArrayList<PessoaJuridica>();
			List<PessoaJuridica> filtroPJ = new ArrayList<>();
			pessoaJuridica = consultasGerais.pesquisaNomePJ(
					txtPesquisa.getText(), em, tipoPes);
			if (pessoaJuridica.isEmpty() == false) {
				listConsultas.add(pessoaJuridica);
				habilitaSelec();
				typePessoa = (T) pessoaJuridica;
			} else if (pessoaJuridica.isEmpty() == true) {
				pessoaFisica = new ArrayList<PessoaFisica>();
				pessoaFisica = consultasGerais.pesquisaNomePF(
						txtPesquisa.getText(), em);
				if (pessoaFisica.isEmpty() == false) {
					listConsultas.add(pessoaFisica);
					typePessoa = (T) pessoaFisica;
					habilitaSelec();
				}
			} else {
				JOptionPane.showMessageDialog(null,
						"Nenhum registro foi encontrado");
				application.close();
			}
		}

		gridPesquisa.getItems().clear();
		gridPesquisa.getItems().addAll(pessoaJuridica);
	}

	public void selecionaDado() {
		PessoaJuridica pj = null;
		PessoaFisica pf = null;
		if (typePessoa == pessoaJuridica) {
			pj = (PessoaJuridica) gridPesquisa.getSelectionModel()
					.getSelectedItem();
		} else {
			pf = (PessoaFisica) gridPesquisa.getSelectionModel()
					.getSelectedItem();
		}
		if ((pj == null) && (pf == null)) {
			JOptionPane.showMessageDialog(null,
					"Nenhum registro foi selecionado");
		} else {
			if(pj != null){
				if(pj.getNaturezaPessoa() == NaturezaPessoa.EMPRESA){
					FrmCadEmpresa.addValores(pj, em);
				}
			}else{
				//implementar cadastro de cliente pf
			}
			application.close();
		}

	}

}
